/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.vue.jsf.form.user;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import net.etrs.formathlon.control.exception.ExceptionManager;
import net.etrs.formathlon.entity.formation.Inscription;
import net.etrs.formathlon.entity.formation.Session;
import net.etrs.formathlon.metier.exception.MetierException;
import net.etrs.formathlon.persistance.formation.InscriptionFacade;
import net.etrs.formathlon.persistance.formation.SessionFacade;
import net.etrs.formathlon.vue.jsf.utils.Confirmable;
import net.etrs.formathlon.vue.jsf.utils.GeneralBean;
import org.apache.commons.mail.EmailException;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

/**
 * ManageBean JSF pour les pages traitant de l'administration des séances.
 * @author OPIF
 */
@ManagedBean
@ViewScoped
public class UserSeanceBean extends GeneralBean implements Confirmable {
    
    @EJB
    private InscriptionFacade inscriptionFacade;
    
    @EJB
    private SessionFacade sessionFacade;
    private List<Session> listSession;
    private Session session;
    
    /**
     * Constructeur par defaut.
     */
    public UserSeanceBean() {
        listSession=new ArrayList<Session>();
    }
    
    /**
     * Demande de verrouillage de la session.
     * @param session La session sélectionnée.
     */
    public void verrouiller(Session session){
        this.session=session;
        getConfirmationBean().open(this, getMessage("application.UserSeanceBean.verrouiller"));
    }
    
    /**
     * Redirection vers la page d'émargement.
     * @param session Session choisie.
     * @return Le lien vers la page d'émargement.
     */
    public String emargement(Session session){
        return String.format("/pages/user/session/emargement.xhtml?session=%d&faces-redirect=true",session.getId());
    }
    
    /**
     * Génération de la feuille d'émargement en PDF.
     * @param session Session choisie.
     * @return Le flux du fichier.
     */
    public StreamedContent imprimer(Session session){
        try {
            InputStream stream = sessionFacade.getFeuilleEmargement(session);
            displayMessage("Création réussie.");
            return new DefaultStreamedContent(stream, "application/pdf", "emargement.pdf");
        } catch (Exception ex) {
            displayErreur(ExceptionManager.traiter(ex));
            return null;
        }
    }

    /**
     * 
     * @param session
     * @return isFermee
     */
    public boolean canVerrouiller(Session session){
        return sessionFacade.isFermee(session);
    }

    /**
     * 
     * @param session
     * @return isVerrouillee
     */
    public boolean canEmarger(Session session){
        return sessionFacade.isVerrouillee(session);
    }

    /**
     * Retour de confirmation. La demande est acceptée.
     * Ne peut être que pour un verrouillage.
     */
    @Override
    public void confirmer() {
        try{
            sessionFacade.verrouiller(session);
            displayMessage(getMessage("application.UserSeanceBean.confirmer"));
        }
        catch (EmailException ex) {
            Logger.getLogger(UserSeanceBean.class.getCanonicalName()).log(Level.SEVERE, null, ex);
        } catch(MetierException ex){
            displayErreur(ExceptionManager.traiter(ex));
        }
    }

    /**
     * Retour de confirmation. La demande est annulée.
     */
    @Override
    public void infirmer() {
    }

    /**
     * @return the listSession
     */
    public List<Session> getListSession() {
        return sessionFacade.getListSessionDispensees(getLoginControler().getUtilisateurConnecte().getPersonnel());
    }

    /**
     * @return the session
     */
    public Session getSession() {
        return session;
    }

    /**
     * @param session the session to set
     */
    public void setSession(Session session) {
        this.session = session;
    }

    /**
     * 
     * @param session
     * @return le nombre d'inscrit
     */
    public int nbInscrit(Session session){
        return inscriptionFacade.getNbInscrit(session);
    }
    
    /**
     * 
     * @param session
     * @return la liste des inscriptions validées
     */
    public List<Inscription> listInscriptionValidees(Session session){
        return inscriptionFacade.getListInscriptionValidees(session);
    }
    
    /**
     * 
     * @param session
     * @return la liste des inscriptions non validées
     */
    public List<Inscription> listInscriptionNonValidees(Session session){
        return inscriptionFacade.getListInscriptionNonValidees(session);
    }

}
